package cockpit.desarrollo.ConectDB;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import cockpit.comm.DTO.DatosException;
import cockpit.comm.DTO.ProductoDTO;

public class Conneccion
{
    private static String driverName = Constantes.DRIVERNAME;
    private static String serverName = Constantes.SERVERNAME;
    private static String portNumber = Constantes.PORTNUMBER;
    private static String squema = Constantes.SQUEMA;
    private static String mydatabase = serverName + ":" + portNumber + "/" + squema;
    private static String url = Constantes.URL + mydatabase; // a JDBC url

    public static Connection getConeccion( ) throws SQLException
    {
        return DriverManager.getConnection( url, Constantes.USER, Constantes.PASSWORD );
//        if( connect != null )
//            return connect;
//        else
//        {
//            connect = DriverManager.getConnection( url, Constantes.USER, Constantes.PASSWORD );
//            return connect;
//        }

    }

    /**
     * Devuelve productos
     * @param datos Campos que entran en la consulta como IDUSUARIO
     * @param datosCondicionales condicionales escritos algo=algo
     * @param tablas
     * @param ini
     * @param fin
     * @param order
     * @return
     * @throws SQLException
     * @throws DatosException ejemplo String[] datos={"*"}; String[] datosCondicionales={"nombre='"+nombre+"'"}; String[] tablas={nombreTablaProductos};
     * 
     *         return getBD(datos, datosCondicionales ,tablas, 0, 1000 ,1);
     */
    public static ArrayList<ProductoDTO> getProductosBD( String[] datos, String[] datosCondicionales, String[] tablas, int ini, int fin, int order ) throws SQLException, DatosException
    {

        ArrayList<ProductoDTO> productos = new ArrayList<ProductoDTO>( );

        String consulta = "SELECT ";

        for( int i = 0; i < datos.length; i++ )
            consulta += ( i == ( datos.length - 1 ) ) ? datos[ i ] : datos[ i ] + ',';
        consulta += "where ";
        for( int i = 0; i < datosCondicionales.length; i++ )
            consulta += ( i == ( datosCondicionales.length - 1 ) ) ? datosCondicionales[ i ] : datosCondicionales[ i ] + " and ";
        consulta += "from ";
        for( int i = 0; i < tablas.length; i++ )
            consulta += ( i == ( tablas.length - 1 ) ) ? tablas[ i ] : tablas[ i ] + " and ";
        // limit
        // orderby
        Connection connect = getConeccion( );
        PreparedStatement stmt = connect.prepareStatement( consulta );
        if( stmt != null )
        {
            ResultSet resultSet = stmt.executeQuery( );

            while( resultSet.next( ) )
            {
                ProductoDTO producto = new ProductoDTO( resultSet );

                productos.add( producto );
            }
        }
        try
        {
            connect.close( );
        }
        catch( SQLException e )
        {
            // TODO Auto-generated catch block
            throw new DatosException( e.getMessage( ) );
        }
        return productos;

    }

    /**
     * 
     * @param datos
     * @param datosCondicionales
     * @param tablas
     * @param ini
     * @param fin
     * @param order
     * @return
     * @throws SQLException
     * @throws DatosException
     */
    public static ResultSet getBD( String[] datos, String[] datosCondicionales, String[] tablas, int ini, int fin, int order ) throws SQLException, DatosException
    {

        ArrayList<ProductoDTO> productos = new ArrayList<ProductoDTO>( );

        String consulta = "SELECT ";

        for( int i = 0; i < datos.length; i++ )
            consulta += ( i == ( datos.length - 1 ) ) ? datos[ i ] : datos[ i ] + ',';
            
        consulta += " from ";
        for( int i = 0; i < tablas.length; i++ )
            consulta += ( i == ( tablas.length - 1 ) ) ? tablas[ i ] : tablas[ i ] + " and ";
        if( datosCondicionales.length > 0 )
            consulta += " where ";

        for( int i = 0; i < datosCondicionales.length; i++ )
            consulta += ( i == ( datosCondicionales.length - 1 ) ) ? datosCondicionales[ i ] : datosCondicionales[ i ] + " and ";

        // limit
        // orderby
        Connection connect = getConeccion( );
        PreparedStatement stmt = connect.prepareStatement( consulta );
        System.out.println( "EJECUTANDO CONSULTA: " + consulta );
        if( stmt != null )
        {
            return stmt.executeQuery( );

        }
        try
        {
            connect.close( );
        }
        catch( SQLException e )
        {
            // TODO Auto-generated catch block
            throw new DatosException( e.getMessage( ) );
        }

        return null;

    }

    /**
     * 
     * @param datos datos para insertar
     * @param tabla tabla
     * @throws DatosException ejemplo
     * 
     *         String[] datos={"idUsuario="+idUsuario, "idCategoria="+idCategoria, "cantidad="+cantidad, "costoVendedor="+costoVendedor, "costoCockpit="+costoCockpit,
     *         "nombreProducto="+nombreProducto, "descripcionProducto="+descripcionProducto, "historiaProducto="+historiaProducto, "Productoscol="+productoscol
     * 
     *         }; String tabla=nombreTablaProductos; insertBD(datos, tabla );
     * @throws SQLException 
     */
    public static void insertBD( String[] datos, String tabla ) throws DatosException
    {
        String consulta = "INSERT INTO " + tabla + " ";
        String campos = "(";
        String values = "VALUES(";
        for( int i = 0; i < datos.length; i++ )
        {
            String[] data = datos[ i ].split( "=" );
            data[ 1 ] = "'" + data[ 1 ] + "'";
            campos += ( i == ( datos.length - 1 ) ) ? data[ 0 ] + ')' : data[ 0 ] + ',';
            values += ( i == ( datos.length - 1 ) ) ? data[ 1 ] + ')' : data[ 1 ] + ',';
        }
        consulta += campos + values;
        Connection connect = null;
        try
        {
            connect = getConeccion( );
            connect.setAutoCommit( false );
            System.out.println( "EJECUTANDO CONSULTA :  " + consulta );
            PreparedStatement stmt = connect.prepareStatement( consulta );
            stmt.execute( );
            connect.commit( );
            connect.setAutoCommit( true );
        }
        catch( SQLException e)
        {
            try
            {
                if(connect!=null)
                connect.rollback( );                
            }
            catch( SQLException e1 )
            {
                e1.printStackTrace( );
            }
            throw new DatosException( e.getMessage( ) );
        }
        try
        {
            connect.close( );
        }
        catch( SQLException e )
        {
            // TODO Auto-generated catch block
            throw new DatosException( e.getMessage( ) );
        }

    }
    /**
     * 
     * @param datos
     * @param datosCondicionales
     * @param tabla
     * @throws DatosException ejemplo
     */
    public static void updateBD( String[] datos, String[] datosCondicionales, String tabla ) throws DatosException
    {

        String consulta = "UPDATE " + tabla + " SET ";

        for( int i = 0; i < datos.length; i++ )
            consulta += ( i == ( datos.length - 1 ) ) ? datos[ i ] : datos[ i ] + ',';

        consulta += " where ";
        for( int i = 0; i < datosCondicionales.length; i++ )
            consulta += ( i == ( datosCondicionales.length - 1 ) ) ? datosCondicionales[ i ] : datosCondicionales[ i ] + " and ";
        Connection connect=null;
        try
        {
            connect = getConeccion( );
            connect.setAutoCommit( false );
            System.out.println("EJECUTANDO CONSULTA: "+ consulta);
            PreparedStatement stmt = getConeccion( ).prepareStatement( consulta );
            stmt.execute( );
            connect.commit( );
            connect.setAutoCommit( true );
        }
        catch( SQLException e )
        {
            try
            {
                if(connect!=null)
                connect.rollback( );
                
            }
            catch( SQLException e1 )
            {
                e1.printStackTrace( );
            }
            e.printStackTrace( );
            throw new DatosException( e.getMessage( ) );
        }
        try
        {
            connect.close( );
        }
        catch( SQLException e )
        {
            // TODO Auto-generated catch block
            throw new DatosException( e.getMessage( ) );
        }

    }

    public static void eliminarBD(String[] datosCondicionales, String tabla ) throws DatosException
    {

        String consulta = "Delete from " + tabla;

        consulta += " where ";
        for( int i = 0; i < datosCondicionales.length; i++ )
            consulta += ( i == ( datosCondicionales.length - 1 ) ) ? datosCondicionales[ i ] : datosCondicionales[ i ] + " and ";
        Connection connect=null;
        try
        {
            connect=  getConeccion( );            
            connect.setAutoCommit( false );
            System.out.println("EJECUTANDO CONSULTA: "+ consulta);
            PreparedStatement stmt = getConeccion( ).prepareStatement( consulta );
            stmt.execute( );
            connect.commit( );
            connect.setAutoCommit( true );
        }
        catch( SQLException e )
        {
            try
            {
                if(connect!=null)
                    connect.rollback( );
            }
            catch( SQLException e1 )
            {
                e1.printStackTrace( );
            }
            e.printStackTrace( );
            throw new DatosException( e.getMessage( ) );
        }
        try
        {
            connect.close( );
        }
        catch( SQLException e )
        {
            // TODO Auto-generated catch block
            throw new DatosException( e.getMessage( ) );
        }

    }
    // Load the JDBC driver

}
